// 定义权限小仓库（选择式Api写法）
import { defineStore } from 'pinia'
import { layoutRouter, errorRouter } from '@/core/router/modules/staticRouter'
import {
  generateRoutes,
  generateFlattenRoutes,
} from '@/core/lib/filterRoute.ts'
import {
  getShowStaticMenuList,
  getShowDynamicMenuList,
  getAllBreadcrumbList,
} from '@/core/lib/index.ts'

// 权限数据，不进行持久化。否则刷新浏览器无法获取新的数据。
const authStore = defineStore('auth', {
  // 存储数据state
  state: (): any => {
    return {
      // 扁平化路由数据
      menuList: [],
      // 递归之后的菜单数据
      recursiveMenuList: [],
      // 用户角色
      roleList: [],
      // 按钮权限列表
      buttonList: [],
      // 用户信息
      loginUser: {
        userId: '',
        loginName: '',
        sex: '',
        avatar: '',
      },
    }
  },
  // 该函数没有上下文数据，所以获取state中的变量需要使用this
  actions: {
    // 获取后端菜单数据
    async listRouters(userMenuList: any = '') {
      // res.data是后端接口原始数据，进行扁平化路由数据。
      this.menuList = generateFlattenRoutes(userMenuList)
      // 持久化递归菜单数据，左侧菜单栏渲染，这里的菜单将后端数据进行递归，需要将动态路由 isHide == 0 的剔除，将静态路由 isHide == 0 的剔除
      this.recursiveMenuList = getShowStaticMenuList([
        layoutRouter,
        errorRouter,
      ]).concat(generateRoutes(getShowDynamicMenuList(userMenuList), ''))
    },
    // 获取角色数据 AND 按钮数据 AND 用户信息
    async getLoginUserInfo() {
      // console.log('用户信息数据', authUser.data)
      ;(this.roleList = ['FANADMIN']),
        (this.buttonList = [
          'system:role:search',
          'system:role:list',
          'system:role:add',
          'system:role:delete',
          'system:role:update',
          'system:role:import',
          'system:role:export',
        ])
      this.loginUser = {
        userId: 1,
        loginName: 'YU-ADMIN',
        sex: '1',
        avatar:
          'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Fae90b4c7-98b6-4a47-b1b3-9ee8bc71acf6%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1692146441&t=6fca60f3a0d323869b81d8fb53b5dd1b',
      }
    },
  },
  // 计算属性，和vuex是使用一样，getters里面不是方法，是计算返回的结果值
  getters: {
    // 按钮权限列表
    getButtonList: (state) => state.buttonList,
    // 菜单权限列表 ==> 原始后端接口菜单数据，扁平化之后的一维数组菜单，主要用来添加动态路由
    getMenuList: (state) => state.menuList,
    // 菜单权限列表 ==> 左侧菜单栏渲染，这里的菜单将后端数据进行递归，需要将动态路由 isHide == 0 的剔除, 将静态路由 isHide == 0 的剔除
    showMenuList: (state) => state.recursiveMenuList,
    // 递归处理后的所有面包屑导航列表
    getBreadcrumbList: (state) => getAllBreadcrumbList(state.recursiveMenuList),
  },
})

// 对外暴露方法
export default authStore
